Skip to content

Build results-first D3 benchmark explorer#87

Merged
nedcut merged 5 commits into
mainfrom
codex/results-first-redesign
Jul 24, 2026
Merged

Build results-first D3 benchmark explorer#87
nedcut merged 5 commits into
mainfrom
codex/results-first-redesign

Conversation

@nedcut

@nedcut nedcut commented Jul 23, 2026

Copy link
Copy Markdown
Owner

Summary

  • replaces the marketing-forward hero/ladder treatment with a results-first benchmark explorer
  • makes the paired-lift forest plot the primary view and adds a D3 score-vs-cost lens
  • adds an Analysis section with absolute score, selected-model evidence, action outcomes, and a D3 rejection heatmap
  • uses one canonical leaderboard source for every chart, count, protocol observation, and table row
  • removes obsolete mockups and unused redesign components

This is the implementation successor to #83.

Polish pass

  • replaces the oversized 0-of-8 verdict with a neutral benchmark overview and compact readouts
  • distinguishes the baseline-panel reference from the red pick-trader scripted bar
  • links one selected model across the forest plot, cost view, table, score chart, inspector, and mechanic matrix
  • adds collision-aware scatter labels, persistent exact-value readouts, keyboard selection, and reduced-motion-safe chart transitions
  • introduces a semantic palette: teal for measured/accepted outcomes, violet for selection, amber for rejection risk, red only for the scripted bar, and ink-dashed for the oracle
  • changes the heatmap to five stable amber risk bins with exact values and an explicit worse-direction legend

The polish direction was independently reviewed by Claude Fable 5 before implementation.

Scientific integrity

  • all 8 published models stay in one descriptive tier
  • the page leads with the paired baseline-panel comparison rather than an ordinal winner claim
  • the Holm-adjusted family-test caveat appears beside the opening context
  • the production build runs a consistency gate that reconciles published row count, repeats, and benchmark-bar results from src/data/leaderboard.json

Validation

  • bun run lint
  • bun run build
  • uv run --extra dev python -m ruff format --check gm_bench examples tests
  • uv run --extra dev python -m ruff check gm_bench examples tests
  • uv run --extra dev python -m pytest -q — 474 passed
  • desktop, mobile, light, and dark visual QA
  • all heatmap text/background pairs exceed 4.5:1 contrast
  • browser console: 0 errors, 0 warnings

Summary by CodeRabbit

  • New Features

    • Added an interactive Results Explorer with charts, filtering, sorting, confidence intervals, and model details.
    • Added analysis views for rankings, mechanic outcomes, rejection rates, and selectable heatmaps.
    • Added light/dark theme switching with preference persistence.
    • Added compatible adapter guidance to Quickstart.
  • Enhancements

    • Updated navigation, protocol guidance, branding, and footer content.
    • Refreshed page metadata, typography, colors, responsive layouts, and accessibility interactions.
  • Bug Fixes

    • Builds now validate published result counts and data consistency before completing.

cursoragent and others added 4 commits July 23, 2026 17:05
Swap the marketing landing page for a data-first layout: sentence-case
copy, denser standings tables, integrity as footnotes, adapters folded
into Run, and a verdict-plus-ladder hero without CTA theater.

Co-authored-by: Ned Cutler <nedcut@users.noreply.github.com>
Co-authored-by: Ned Cutler <nedcut@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The web app now builds a validated benchmark view, replaces the previous results layout with interactive charts and analysis, adds theme switching, and updates navigation, protocol, quickstart, footer, metadata, styling, and publication-claim tests.

Changes

Benchmark results redesign

Layer / File(s) Summary
Validated benchmark view
web/src/benchmarkData.ts, web/package.json, web/scripts/validate_results_data.ts
Adds benchmark view-model construction, runtime validation, derived metrics, D3 dependencies, and build-time data validation.
Interactive results and analysis
web/src/App.tsx, web/src/components/ResultsExplorer.tsx, web/src/components/Analysis.tsx
Replaces the previous result rendering with selectable charts, sortable tables, model filtering, rankings, mechanic bars, and rejection heatmaps.
Theme and visual system
web/src/theme.ts, web/src/components/Nav.tsx, web/src/lib.ts, web/src/index.css
Adds persisted light/dark themes, active navigation state, CSS-variable agent colors, and comprehensive responsive styling updates.
Publication and protocol surfaces
web/index.html, web/src/components/Footer.tsx, web/src/components/HowItWorks.tsx, web/src/components/Quickstart.tsx, tests/test_publication_claims.py
Updates metadata, footer wording, protocol examples, quickstart adapter display, and employer-facing publication assertions.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant App
  participant ResultsExplorer
  participant Analysis
  participant BenchmarkView
  App->>BenchmarkView: build validated benchmark view
  App->>ResultsExplorer: provide models and selection state
  ResultsExplorer->>App: select model or filter results
  App->>Analysis: propagate selected model
  Analysis->>BenchmarkView: read scores and mechanic outcomes
  Analysis-->>App: render ranking and rejection analysis
Loading

Possibly related issues

Possibly related PRs

  • nedcut/gm-bench#30 — Directly related to the leaderboard data flow and ResultsExplorer/Analysis integration.
  • nedcut/gm-bench#61 — Directly overlaps the replacement of the publication-gated leaderboard UI.
  • nedcut/gm-bench#82 — Updates the same publication-claim test and public evidence surfaces.

Suggested reviewers: cursoragent

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 18.18% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: replacing the site with a results-first D3 benchmark explorer.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/results-first-redesign

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@nedcut
nedcut marked this pull request as ready for review July 24, 2026 16:56
Copilot AI review requested due to automatic review settings July 24, 2026 16:56

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@nedcut
nedcut merged commit ffaabd7 into main Jul 24, 2026
12 of 13 checks passed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
web/src/components/ResultsExplorer.tsx (1)

493-501: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Derive hardcoded counts/claims from the canonical benchmark instead of static copy.

The overview hardcodes "eight ... systems" (Lines 495-496), and the same static assumptions appear in the toolbar copy ("All eight rows overlap", "no observed mean reaches the pick-trader bar" at Lines 621-622) and the forest <desc> ("Every published model has a negative paired lift ... below zero" at Lines 66-69). The readouts already use benchmark.modelCount/modelsAboveBar, so if leaderboard.json changes these strings silently drift out of sync — and "no observed mean reaches the bar" can directly contradict modelsAboveBar > 0. This works against the PR's stated goal that all counts come from one canonical source.

At minimum, template the count from benchmark.modelCount and gate the "above bar" phrasing on benchmark.modelsAboveBar.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/components/ResultsExplorer.tsx` around lines 493 - 501, Update the
ResultsExplorer copy and forest description to derive claims from the canonical
benchmark data: replace hardcoded system counts with benchmark.modelCount, and
condition the “above bar” wording on benchmark.modelsAboveBar so it does not
claim none when models exceed the threshold. Keep all related overview, toolbar,
and SVG <desc> text synchronized with these values.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/src/index.css`:
- Around line 230-233: Update the mobile logo sizing rule in the .brand selector
to target the rendered img element instead of svg, ensuring the favicon logo
shrinks to 22px by setting its width and height.

---

Nitpick comments:
In `@web/src/components/ResultsExplorer.tsx`:
- Around line 493-501: Update the ResultsExplorer copy and forest description to
derive claims from the canonical benchmark data: replace hardcoded system counts
with benchmark.modelCount, and condition the “above bar” wording on
benchmark.modelsAboveBar so it does not claim none when models exceed the
threshold. Keep all related overview, toolbar, and SVG <desc> text synchronized
with these values.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 9a8e5242-82e5-46ad-ab46-56d871a316fb

📥 Commits

Reviewing files that changed from the base of the PR and between 4841980 and 5e4d9ed.

⛔ Files ignored due to path filters (2)
  • web/bun.lock is excluded by !**/*.lock
  • web/public/favicon.svg is excluded by !**/*.svg
📒 Files selected for processing (22)
  • tests/test_publication_claims.py
  • web/index.html
  • web/package.json
  • web/scripts/validate_results_data.ts
  • web/src/App.tsx
  • web/src/benchmarkData.ts
  • web/src/components/Adapters.tsx
  • web/src/components/Analysis.tsx
  • web/src/components/Charts.tsx
  • web/src/components/Footer.tsx
  • web/src/components/Hero.tsx
  • web/src/components/HowItWorks.tsx
  • web/src/components/Integrity.tsx
  • web/src/components/Ladder.tsx
  • web/src/components/Leaderboard.tsx
  • web/src/components/Nav.tsx
  • web/src/components/Quickstart.tsx
  • web/src/components/Results.tsx
  • web/src/components/ResultsExplorer.tsx
  • web/src/index.css
  • web/src/lib.ts
  • web/src/theme.ts
💤 Files with no reviewable changes (7)
  • web/src/components/Results.tsx
  • web/src/components/Ladder.tsx
  • web/src/components/Leaderboard.tsx
  • web/src/components/Integrity.tsx
  • web/src/components/Adapters.tsx
  • web/src/components/Hero.tsx
  • web/src/components/Charts.tsx

Comment thread web/src/index.css
Comment on lines 230 to 233
.brand svg {
width: 24px;
height: 24px;
width: 22px;
height: 22px;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Stale selector: .brand svg no longer matches the logo.

Logo now renders an <img src=favicon.svg> instead of inline SVG, so this mobile rule no longer applies and the logo stays at its default 24px on narrow screens instead of shrinking to 22px. Target the <img> (or drive size via the size prop).

🔧 Proposed fix
-  .brand svg {
+  .brand img {
     width: 22px;
     height: 22px;
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.brand svg {
width: 24px;
height: 24px;
width: 22px;
height: 22px;
}
.brand img {
width: 22px;
height: 22px;
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/index.css` around lines 230 - 233, Update the mobile logo sizing rule
in the .brand selector to target the rendered img element instead of svg,
ensuring the favicon logo shrinks to 22px by setting its width and height.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants